package gamebook;

public class Paginacion {

    private int registrosPorPagina;
    private int paginaActual;
    private int registrosTotales;

    public Paginacion(int registrosPorPagina, int registrosTotales, int paginaActual) {
        this.registrosPorPagina = registrosPorPagina;
        this.paginaActual = paginaActual;
        this.registrosTotales = registrosTotales;
    }

    public int getPaginaActual() {
        return paginaActual;
    }

    public void setPaginaActual(int paginaActual) {
        this.paginaActual = paginaActual;
    }

    public int getRegistrosPorPagina() {
        return registrosPorPagina;
    }

    public void setRegistrosPorPagina(int registrosPorPagina) {
        this.registrosPorPagina = registrosPorPagina;
    }

    public int getRegistrosTotales() {
        return registrosTotales;
    }

    public void setRegistrosTotales(int registrosTotales) {
        this.registrosTotales = registrosTotales;
    }

    /**
     * Devuelve el número del primer registro que debe aparecer en la página
     * el último debería ser: offset + registrosPorPagina
     * @return int primer registro que debe aparecer
     */
    public int offset() {
        return (getPaginaActual() * registrosPorPagina);
    }

    /**
     * Devuelve el número de la última página que hay. Las páginas se numeran
     * desde el 1 que es la primera hasta este valor que es la última.
     * @return int número de la última página
     */
    public int ultimaPagina() {
        //Hacemos la división entera para obtener el valor
        int ultimaPagina = registrosTotales / registrosPorPagina;
        //Si la división es exacta quitamos una página
        if (registrosTotales % registrosPorPagina == 0) {
            //Si no hacemos esto, la última página aparece vacía
            ultimaPagina--;
        }
        //Debe haber al menos una página
        if(ultimaPagina<=0){
            ultimaPagina=0;
        }
        //Devolvemos el valor
        return ultimaPagina;
    }

    /**
     * La página anterior será la actual menos uno, a no ser que ya estemos en la cero
     * @return int página anterior a la que estamos
     */
    public int paginaAnterior() {
        return (paginaActual - 1) < 0 ? paginaActual : (paginaActual - 1);
    }

    /**
     * La página siguiente será la actual más uno, a no ser que ya estemos en la última
     * @return int página siguiente a la que estamos
     */
    public int paginaPosterior() {
        return (paginaActual + 1) > ultimaPagina() ? paginaActual : (paginaActual + 1);
    }

    /**
     * Método estatico que sirve para obtener el valor de la página en que estamos
     * a partir del parametro GET. Ej. muro.jsp?pag=4
     * Este método coge la cadena de pag y lo transforma en el valor de pagina actual.
     * En caso de que el String esté vacío o no sea válido devuelve la primera página.
     * @param paginaActual String que se obtiene por GET
     * @return int número de la página en la que estamos
     */
    public static int cogePagDeGet(String pag) {
        int pagina = 0;
        if (pag != null) {
            try {
                pagina = Integer.parseInt(pag) - 1;
                if (pagina < 0) {
                    pagina = 0;
                }
            } catch (NumberFormatException ex) {
                pagina = 0;
            }
        }
        return pagina;
    }
}
